import {
  buildDayjs,
  DateTimeFormatStyleEnum,
  daySubtract,
  getIsoWeek,
  getISOWeekFirstDay,
  getISOWeekLastDay,
  getIsoWeekYYYYMM,
  yearSubtract
} from './DateUtil'

declare global {
  interface Window {
    /**
     * 系统变量
     */
    _SYS_VAR: Record<string, unknown> | CommSystemVar
  }
}
/**
 * 公共系统变脸
 */
interface CommSystemVar {
  /**
   * # 今天
   * ---
   * 值格式: YYYY-MM-DD 如:2024-01-27
   */
  SYS_TODY_YYYY_MM_DD: string
  /**
   * # 今天
   * ---
   * 值格式: YYYYMMDD 如: 20240127
   */
  SYS_TODY_YYYYMMDD: string
  /**
   * # 今天
   * ---
   * 值格式: DD 如: 27, 01
   */
  SYS_TODY_DD: string
  /**
   * # 今天
   * ---
   * 值格式: DD 如: 7, 27
   */
  SYS_TODY_D: number
  /**
   * # 当前月
   * ---
   * 值格式: YYYY-MM 如: 2024-07
   */
  SYS_CURRENT_MONTH_YYYY_MM: string
  /**
   * # 当前月
   * ---
   * 值格式: YYYY-MM 如: 202407, 202412
   */
  SYS_CURRENT_MONTH_YYYYMM: string
  /**
   * # 当前ISO周
   * ---
   * 值格式: YYYY-WW 如: 2024-07, 2024-32
   */
  SYS_CURRENT_ISO_WEEK_YYYY_WW: string
  /**
   * # 当前ISO周
   * ---
   * 值格式: YYYY-WW 如: 202407, 202432
   */
  SYS_CURRENT_ISO_WEEK_YYYYWW: string
  /**
   * # 当前ISO周
   * ---
   * 如: 30
   */
  SYS_CURRENT_ISO_WEEK_W: number
  /**
   * # 当前周第一天
   * ---
   * 值格式: YYYY-MM-DD 如: 2024-09-23
   */
  SYS_CURRENT_ISO_WEEK_FIRST_DAY_YYYY_MM_DD: string
  /**
   * # 当前周第一天
   * ---
   * 值格式: YYYYMMDD 如: 20240923
   */
  SYS_CURRENT_ISO_WEEK_FIRST_DAY_YYYYMMDD: string
  /**
   * # 当前周最后一天
   * ---
   * 值格式: YYYY-MM-DD 如: 2024-09-23
   */
  SYS_CURRENT_ISO_WEEK_LAST_DAY_YYYY_MM_DD: string
  /**
   * # 当前周最后一天
   * ---
   * 值格式: YYYYMMDD 如: 20240923
   */
  SYS_CURRENT_ISO_WEEK_LAST_DAY_YYYYMMDD: string
  /**
   * # 5天前的日期（不包含今天）
   * ---
   * 值格式: YYYY-MM-DD 如: 今天是2024-01-06，五天前就是:2024-01-01
   */
  SYS_BEFORE_FIVE_DAY_YYYY_MM_DD: string
  /**
   * # 5天前的日期（不包含今天）
   * ---
   * 值格式: YYYYMMDD 如: 今天是20240106，五天前就是:20240101
   */
  SYS_BEFORE_FIVE_DAY_YYYYMMDD: string
  /**
   * # 今年
   */
  SYS_CURRENT_YEAR: number
  /**
   * # 5年前的年份(包含今年)
   * ---
   * 如: 今年是2024年，5年前就是2020
   */
  SYS_BEFORE_FIVE_YEAR: number
}

export function createOrUpdateCommSystemVar(
  currentDateStr?: string,
  format: DateTimeFormatStyleEnum = DateTimeFormatStyleEnum.YYYY_MM_DD
) {
  const dj = buildDayjs(currentDateStr, format)
  const commSystemVar: CommSystemVar = {
    SYS_TODY_YYYY_MM_DD: dj.format(DateTimeFormatStyleEnum.YYYY_MM_DD),
    SYS_TODY_YYYYMMDD: dj.format(DateTimeFormatStyleEnum.YYYYMMDD),
    SYS_TODY_DD: dj.format(DateTimeFormatStyleEnum.DD),
    SYS_TODY_D: dj.get('date'),
    SYS_CURRENT_MONTH_YYYY_MM: dj.format(DateTimeFormatStyleEnum.YYYY_MM),
    SYS_CURRENT_MONTH_YYYYMM: dj.format(DateTimeFormatStyleEnum.YYYYMM),
    SYS_CURRENT_ISO_WEEK_YYYY_WW: getIsoWeekYYYYMM(currentDateStr, format),
    SYS_CURRENT_ISO_WEEK_YYYYWW: getIsoWeekYYYYMM(currentDateStr, format, false),
    SYS_CURRENT_ISO_WEEK_W: getIsoWeek(currentDateStr, format),
    SYS_CURRENT_ISO_WEEK_FIRST_DAY_YYYY_MM_DD: getISOWeekFirstDay(
      currentDateStr,
      format,
      DateTimeFormatStyleEnum.YYYY_MM_DD
    ),
    SYS_CURRENT_ISO_WEEK_FIRST_DAY_YYYYMMDD: getISOWeekFirstDay(
      currentDateStr,
      format,
      DateTimeFormatStyleEnum.YYYYMMDD
    ),
    SYS_CURRENT_ISO_WEEK_LAST_DAY_YYYY_MM_DD: getISOWeekLastDay(
      currentDateStr,
      format,
      DateTimeFormatStyleEnum.YYYY_MM_DD
    ),
    SYS_CURRENT_ISO_WEEK_LAST_DAY_YYYYMMDD: getISOWeekLastDay(
      currentDateStr,
      format,
      DateTimeFormatStyleEnum.YYYYMMDD
    ),
    SYS_BEFORE_FIVE_DAY_YYYY_MM_DD: daySubtract(
      5,
      currentDateStr,
      format,
      DateTimeFormatStyleEnum.YYYY_MM_DD
    ),
    SYS_BEFORE_FIVE_DAY_YYYYMMDD: daySubtract(
      5,
      currentDateStr,
      format,
      DateTimeFormatStyleEnum.YYYYMMDD
    ),
    SYS_CURRENT_YEAR: dj.get('year'),
    SYS_BEFORE_FIVE_YEAR: yearSubtract(4, currentDateStr, format)
  }
  return commSystemVar
}
